package com.trace.demo.repository;

import com.trace.demo.entity.LoginLog;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 登录日志数据访问接口
 */
@Repository
public interface LoginLogRepository extends JpaRepository<LoginLog, Long>, JpaSpecificationExecutor<LoginLog> {
    
    /**
     * 根据用户ID查询登录日志
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 登录日志分页结果
     */
    Page<LoginLog> findByUserId(Long userId, Pageable pageable);
    
    /**
     * 根据用户名查询登录日志
     * @param userName 用户名
     * @param pageable 分页参数
     * @return 登录日志分页结果
     */
    Page<LoginLog> findByUserName(String userName, Pageable pageable);
    
    /**
     * 根据登录状态查询登录日志
     * @param status 登录状态
     * @param pageable 分页参数
     * @return 登录日志分页结果
     */
    Page<LoginLog> findByStatus(String status, Pageable pageable);
    
    /**
     * 根据登录时间范围查询登录日志
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param pageable 分页参数
     * @return 登录日志分页结果
     */
    Page<LoginLog> findByLoginTimeBetween(LocalDateTime startTime, LocalDateTime endTime, Pageable pageable);
    
    /**
     * 根据用户名或IP地址模糊查询
     * @param keyword 关键词
     * @param pageable 分页参数
     * @return 登录日志分页结果
     */
    @Query("SELECT l FROM LoginLog l WHERE l.userName LIKE %:keyword% OR l.ipAddress LIKE %:keyword%")
    Page<LoginLog> findByUserNameOrIpAddressContaining(@Param("keyword") String keyword, Pageable pageable);
    
    /**
     * 复合条件查询登录日志
     * @param userName 用户名
     * @param status 登录状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param pageable 分页参数
     * @return 登录日志分页结果
     */
    @Query("SELECT l FROM LoginLog l WHERE " +
           "(:userName IS NULL OR l.userName LIKE %:userName%) AND " +
           "(:status IS NULL OR l.status = :status) AND " +
           "(:startTime IS NULL OR l.loginTime >= :startTime) AND " +
           "(:endTime IS NULL OR l.loginTime <= :endTime)")
    Page<LoginLog> findByConditions(
            @Param("userName") String userName,
            @Param("status") String status,
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            Pageable pageable);
    
    /**
     * 清空所有登录日志
     */
    @Modifying
    @Query("DELETE FROM LoginLog")
    void deleteAllLogs();
} 